from django.db.models import Avg,Max,Min,Sum,Count,Q
from product.models import Product
from django.http import HttpResponse
"""
聚合函数用于对查询集中的数据进行聚合操作，如计算平均值、总和、最大值、最小值等。

主要进行进行聚合操作的函数是aggregate()
"""
# 基础统计
def agnotate_view(self):
    # 聚合函数aggregate
    stats = Product.objects.aggregate(
        # {'total_stock': 7318}
        total_stock=Sum('stock'),
        
        # 'avg_price': Decimal('2118.400000')
        avg_price=Avg('price'),
        # 'max_price': Decimal('5000.00')
        max_price=Max('price'),
        # 'min_price': Decimal('142.08')
        min_price=Min('price'),
        # 'active_count': 5
        active_count=Count('id',filter=Q(is_active=True))
        # {'total_stock': 7318, 
        # 'avg_price': Decimal('2118.400000'), 
        # 'max_price': Decimal('5000.00'), 
        # 'min_price': Decimal('142.08'), 
        # 'active_count': 5}
        
    )
    # print(stats)
    
    # 分组函数annotate
    # 按照上架状态is_active分组，并统计. values() 控制查询返回的数据格式，将queryset中的模型实例转换为字典类型(与json格式类似,便于前端处理)，指定要返回的字段（sql语句中的select）
    products_by_status = Product.objects.values('is_active').annotate(product_count=Count('id'),avg_stock=Avg('stock'))   # <QuerySet [{'is_active': True, 'product_count': 5, 'avg_stock': 1443.6}, {'is_active': False, 'product_count': 1, 'avg_stock': 100.0}]>
    # print(products_by_status)
    
    # 排序方法order_by
    # 升序(default)
    products = Product.objects.all().order_by('price')
    # 降序 
    products = Product.objects.all().order_by('-price')
    products = Product.objects.filter(is_active=True).order_by('-price')
    print(products)
    
    
    
    return HttpResponse("ok")
